Lombok簡化模板代碼

Lombok可以做到对已有Java代码在字节码层级的改变,它的目的在于让程序员少写一些“样板代码”;所谓样板代码是那些没有营养,却又不得不写的代码;像实体中定义的getter、setter、equals、hashcode、toString等方法).

Intelli IDEA安装Lombok插件

1.【Intelli IDEA】- 【Preferences】-【plugins】

  1. 搜索lombok,点击install.

Lombok常用注解

  • @Getter/ @Setter:
    注解在属性上;为属性提供 getting 和 setting 方法

  • @ToString:
    实现toString()方法

  • @EqualsAndHashCode:
    实现equals()方法和hashCode()方法

  • @Data :
    注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法

  • @Log4j :
    注解在类上;为类提供一个 属性名为log 的 log4j 日志对象

  • @NoArgsConstructor:
    注解在类上;为类提供一个无参的构造方法

  • @AllArgsConstructor:
    注解在类上;为类提供一个全参的构造方法

  • @Builder:
    注解在类上:实现一种Builder Patterns(生成器模式)的功能

  • @SneakyThrows:
    注解到方法上:可以实现在try…catch到异常后进行的throw操作

  • @Synchronized:
    注解到方法上:实现同步代码片段的功能

更多注解说明: 官方文档

Lombok使用

常用的模板代码注解化示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
@Setter
@Getter
@ToString
@EqualsAndHashCode
@Builder
@NoArgsConstructor
@AllArgsConstructor
class BasicModel implements Serializable{

private Long id;
private String title;
private Double score;
private Date createTime;

public static void main(String[] args) {

Date now = new Date();

// 通用模式构建对象
BasicModel bm1 = new BasicModel();
bm1.setCreateTime(now);
bm1.setId(1L);
bm1.setScore(11D);
bm1.setTitle("Lombok示例1");

// Builder模式构建对象
BasicModel bm2 = BasicModel.builder()
.id(1L).score(11D).title("Lombok示例1").createTime(now)
.build();

// 全参构造
// 需要注意的是Lombok提供的全参构造是依赖属性在对象中定义顺序的,
BasicModel bm3 = new BasicModel(2L, "Lombok示例1", 11D, now);

// toString使用
System.out.println("bm1 = " + bm1);
System.out.println("bm2 = " + bm2);
System.out.println("bm3 = " + bm3);

// equals()使用
System.out.println("bm1.equals(bm2) = " + bm1.equals(bm2));
System.out.println("bm1.equals(bm3) = " + bm1.equals(bm3));

}
}

示例执行结果

1
2
3
4
5
bm1 = BasicModel(id=1, title=Lombok示例1, score=11.0, createTime=Sun Nov 27 17:14:17 CST 2016)
bm2 = BasicModel(id=1, title=Lombok示例1, score=11.0, createTime=Sun Nov 27 17:14:17 CST 2016)
bm3 = BasicModel(id=2, title=Lombok示例1, score=11.0, createTime=Sun Nov 27 17:14:17 CST 2016)
bm1.equals(bm2) = true
bm1.equals(bm3) = false

上面的注解可以简化为如下

1
2
3
4
5
6
7
8
9
10
11
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class BasicModel implements Serializable{

private Long id;
private String title;
private Double score;
private Date createTime;
}

Lombok问题方案

问题: 父子类集成关系中中全参构造, 以及Builder模式构建对象时,父类属性不可见。
方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@Data
@NoArgsConstructor
@AllArgsConstructor
class BasicModel implements Serializable{

private Long id;
private String title;
private Double score;
private Date createTime;
}


@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString(callSuper = true)
class ArticleModel extends BasicModel{

private String author;
private String images;

// 增减该构造方案, 此时子类中有三个构造,@NoArgsConstructor、@AllArgsConstructor、当前构造
@Builder
public ArticleModel(Long id, String title, Double score, Date createTime,
String author, String images) {
super(id, title, score, createTime);
this.author = author;
this.images = images;
}

public static void main(String[] args) {

Date now = new Date();

// Builder模式构建对象
ArticleModel am1 = ArticleModel.builder()
.id(1L).score(11D).title("Lombok示例1").createTime(now)
.author("Elon.su").images("图片地址")
.build();

// 常见的模板对象创建
ArticleModel am2 = new ArticleModel("Elon.su", "图片地址");
am2.setId(1L);
am2.setTitle("Lombok示例1");
am2.setCreateTime(now);

// toString使用
System.out.println("am1 = " + am1);
System.out.println("am2 = " + am2);

// equals()使用
System.out.println("am1.equals(am2) = " + am1.equals(am2));
}
}

示例执行结果

1
2
3
am1 = ArticleModel(super=BasicModel(id=1, title=Lombok示例1, score=11.0, createTime=Sun Nov 27 17:41:53 CST 2016), author=Elon.su, images=图片地址)
am2 = ArticleModel(super=BasicModel(id=1, title=Lombok示例1, score=null, createTime=Sun Nov 27 17:41:53 CST 2016), author=Elon.su, images=图片地址)
am1.equals(am2) = true